home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 012 / ippon012.lzh / shot.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  2KB  |  98 lines

  1. /* shot.c */
  2.  
  3. #include <stdio.h>
  4. #include <xsp2lib.h>
  5.  
  6. #include "main.h"
  7. #include "player.h"
  8. #include "shot.h"
  9.  
  10. #define SHOT_MAX    1    /* ショット最大数 */
  11. static SHOT shot[SHOT_MAX];    /* ワーク */
  12.  
  13. #define PALET_SHOT        0x0800
  14.  
  15. #define SHOT_SPEED    31
  16.  
  17.  
  18.  
  19. /* ゲーム開始時に呼ばれる */
  20. void ShotInit (void)
  21. {
  22.     int i;
  23.  
  24.     /* リストをつなげる */
  25.     shot_top = NULL;
  26.     shot_null_top = shot;
  27.     for (i = 0; i < SHOT_MAX; i++)
  28.         shot[i].next = &shot[i + 1];
  29.  
  30.     shot[SHOT_MAX - 1].next = NULL;
  31. }
  32.  
  33.  
  34.  
  35. /* ショット出現時に呼ばれる */
  36. void ShotAlloc (void)
  37. {
  38.     SHOT *p;
  39.  
  40.     if (shot_null_top == NULL)    /* ワークの空きはあるか? */
  41.         return;
  42.  
  43.     p = shot_null_top;
  44.     shot_null_top = p->next;
  45.     p->next = shot_top;
  46.     shot_top = p;
  47.  
  48.     p->lx = (player->x) << 16;    /* ショットの座標は自機+(0,-16) */
  49.     p->ly = (player->y + 4) << 16;    /* 自機の少し上に出す */
  50.     p->pt = obj_shot;
  51.     p->info = PALET_SHOT | PRIORITY_SHOT;
  52.     p->damage = 0;
  53.     p->vx = xytable[SHOT_SPEED][192].x;
  54.     p->vy = xytable[SHOT_SPEED][192].y;
  55.     p->hit_x = 3;
  56.     p->hit_y = 8;
  57. }
  58.  
  59.  
  60.  
  61. /* 垂直同期ごとに呼ばれる */
  62. void ShotMove (void)
  63. {
  64.     SHOT *p, *q;
  65.  
  66.     p = shot_top;        /* 現在注目しているワーク */
  67.     q = NULL;        /* 1つ前のワーク(ワーク削除時に必要) */
  68.     while (p != NULL) {
  69.         /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  70.         p->x = (p->lx += p->vx) >> 16;
  71.         p->y = (p->ly += p->vy) >> 16;
  72.  
  73.         /* ショットが敵に当たった又は画面外に出たか? */
  74.         /* (画面右から出た判定と左から出た判定を1回の比較で行っている事に注目) */
  75.         if ((p->damage)
  76.             || ((unsigned short) (p->x) > 256 + 16)
  77.             || ((unsigned short) (p->y) > 256 + 16)) {
  78.  
  79.             if (q == NULL) {    /* リストの一番最初を削除 */
  80.                 shot_top = p->next;
  81.                 p->next = shot_null_top;
  82.                 shot_null_top = p;
  83.                 q = NULL;
  84.                 p = shot_top;
  85.             } else {
  86.                 q->next = p->next;
  87.                 p->next = shot_null_top;
  88.                 shot_null_top = p;
  89.                 p = q->next;
  90.             }
  91.         } else {
  92.             xobj_set_st (p);
  93.             q = p;
  94.             p = p->next;
  95.         }
  96.     }
  97. }
  98.